package cn.wolfcode.wolf2w.controller;

import cn.wolfcode.wolf2w.LogicException;
import cn.wolfcode.wolf2w.annotation.RequireLogin;
import cn.wolfcode.wolf2w.cache.service.IStrategyStatisVORedisService;
import cn.wolfcode.wolf2w.cache.service.IUserInfoRedisService;
import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("users")
public class UserInfoController {

    //service在core项目中,配置位置是api 项目,后寻mgrsite也会到core项目
    //那么如果在这个地方注入配置属性,后续必须在mgrsite配置文件中添加2个配置
    //sms.url  sms.appkey
    @Value("${sms.url}")
    private String smsUrl;
    @Value("${sms.appkey}")
    private String appKey;


    @Autowired
    private IUserInfoService userInfoService;

    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    @Autowired
    private IStrategyStatisVORedisService strategyStatisVORedisService;//攻略的vo对象

    /**
     * 前段和后端的接口,接下来就是启动类website
     * @param id
     * @return
     */

    @GetMapping("/get")
    private Object get(String id){
        return userInfoService.get(id);
    }

    /**
     * 从前端页面regist.html可以清楚,该方法使用的是get请求的方法
     * 手机号而且使用的boolean类型的判断
     * @param phone
     * @return
     */
    @GetMapping("/checkPhone")
    private Object checkPhone(String phone){
        //判断手机号码是否存在

       boolean ret =  userInfoService.checkPhone(phone);
        return !ret;
    }

    /**
     * 从前端页面regist.html可以清楚,该方法使用的是get请求的方法
     * 返回的是JsonResult的对象
     * @param phone
     * @return
     */
    @GetMapping("/sendVerifyCode")
    private Object sendVerifyCode(String phone){
        userInfoService.sendVerifyCode(phone,smsUrl,appKey);
        return JsonResult.success();//返回成功的状态给我
    }

    //当code值不等于200,时候向客户抛出异常错误提醒
    @PostMapping("/regist")
    private Object regist(String phone,String nickname,String password,String rpassword,String verifyCode){
        userInfoService.regist(phone,nickname,password,rpassword,verifyCode);
        return JsonResult.success();//返回成功的状态给我
    }


    @PostMapping("/login")
    private Object login(String username,String password){
        //登录成功之后返回用户对象
       UserInfo user = userInfoService.login(username,password);

       //创建token,然后将token添加到Redis上
        String token = userInfoRedisService.setToken(user);

        //页面需要:token user
        Map<String,Object> map = new HashMap<>();
        map.put("token",token);
        map.put("user",user);

        //页面需要
        return JsonResult.success(map);//返回成功的状态给我
    }


    //假设 要页面发起请求带有token这个请求头
    @RequireLogin //如果有这个标签,那么权限是不放行的
    @GetMapping("/currentUser")
    private Object currentUser(HttpServletRequest request){

        //从请求头获取token
        String token = request.getHeader("token");
        //通过token从Redis中获取用户的信息

       UserInfo user =  userInfoRedisService.getUserByToken(token);
        return JsonResult.success(user);//返回成功的状态给我
    }

    //假设 要页面发起请求带有token这个请求头
//    @RequireLogin //如果有这个标签,那么权限是不放行的
    @GetMapping("/strategies/favor")
    private Object strategiesFavor(String userId){
        //这里是用户用户id去判断
        return JsonResult.success(strategyStatisVORedisService.getUserStrategyFavor(userId));

    }

}
